package org.csu.mybigpro.util;

import jakarta.validation.ConstraintViolation;
import jakarta.validation.ConstraintViolationException;
import lombok.extern.slf4j.Slf4j;
import org.csu.mybigpro.common.CommonResponse;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.http.HttpStatus;
import org.springframework.web.bind.MissingServletRequestParameterException;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.ResponseStatus;

//通过AOP切面的方式，给每一个controller都加上这个异常处理

@ControllerAdvice
//使用日志处理,使得在后端也可以看到这个错误
@Slf4j
//注意，父类异常一定要写在子类的下面
public class GlobalExceptionHandler {
    //创建日志对象
    Logger logger = LoggerFactory.getLogger(GlobalExceptionHandler.class);

    //这个异常会被它捕获
    @ExceptionHandler(MissingServletRequestParameterException.class)
    //由于被它所拦截，所以可以改
    //400
    @ResponseStatus(code = HttpStatus.BAD_REQUEST)
    @ResponseBody
    //会在前端返回这个对象和提示信息
    //同时可以拿到这个e对象,使得在后端也可以看到这个错误
    public CommonResponse<Object> handleMissingServletRequestParameterException(MissingServletRequestParameterException e){
//        e.printStackTrace();
        //这样就会在下面控制台不报红错误，而是以日志的方式提示你
        logger.error(e.getMessage());
        return  CommonResponse.createForError("缺少参数");

    }
    //处理另外一种异常
    @ExceptionHandler(ConstraintViolationException.class)
    //500
    @ResponseStatus(code = HttpStatus.INTERNAL_SERVER_ERROR)
    @ResponseBody
    public CommonResponse<Object> handleConstraintViolationException(ConstraintViolationException e){
        logger.error(e.getMessage());
        //这样可以拿到notBlank里面的message
        return  CommonResponse.createForError(e.getMessage());
    }

    //由于这个全局异常处理是从上往下处理的，所以可以在最后加一个方法(所有异常的父类)

    @ExceptionHandler(Exception.class)
    //500
    @ResponseStatus(code = HttpStatus.INTERNAL_SERVER_ERROR)
    @ResponseBody
    public CommonResponse<Object> handleException(Exception e)
    {
        logger.error(e.getMessage());
        //这样可是使得它以红字的方式打印出来错误类型，方便去更新这个全局异常处理类
        e.printStackTrace();
        return CommonResponse.createForError("服务器异常");
    }
}